import { HeadersType, Methods } from "@/http";
import { BasicFormBox } from "../basic-form-box";
import { BasicTaleBox } from "../basic-table-box";

type FromsType<FN, K extends keyof FN> = Record<K, BasicFormBox<FN[K]>>;
type TablesType<TN, K extends keyof TN> = Record<K, BasicTaleBox<TN[K]>>;
type Find<T, K extends keyof T> = K extends keyof T ? T[K] : never;
export type ResultField = "rows" | "data" | string;

type RequestOptions<T> = {
	/** TODO /page/#page#/#pageSize#/classfiy  */
	url?: string;
	/** 远程数据存储字段 */
	resultField?: ResultField;
	/** 是否携带表单参数 默认 true */
	formParam?: boolean;
	/** 请求头 */
	headerTyps?: HeadersType;
	/** 请求方式 */
	method?: Methods;
	/** 当 filterSearchData 存在时, 是否将表单参数合并至 filterSearchData 结果中 默认合并 */
	mergeParams?: boolean;
	/** 过滤请求参数 */
	filterSearchData?: (data: Record<string, any>) => Record<string, any>;
	/** 请求数据二次处理方法 */
	filterData?: (dataArray: any[]) => T[];
	/** 当请求地址不止存在分页信息时可以通过该方法的返回值进行配置 */
	otherCodeReplace?: (form: Record<string, any>) => Record<string, any>;
};

type LayoutOption<T = string> = {
	/** 名字 */
	name: T;
	/** 区域 同名的 block 会被合并在一起作为一个块渲染 */
	block?: string | null;
	/** 排序 升序排序  */
	sort?: number;
	/** 标题 同名的 block 会使用 sort 较高的标题  */
	title?: string;
};

export type { FromsType, TablesType, Find, RequestOptions, LayoutOption };
